package com.unmarshaller.xmlunmarshaller;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import org.apache.log4j.Logger;

import com.unmarshaller.xmlunmarshaller.XmlUnmarshaller;


/**
 * XML原型数据管理类
 * @author hongxiao.z
 * @date	2013-10-18
 */
public class XmlDataProcess
{
	private static Logger log = Logger.getLogger(XmlDataProcess.class);
	
	/**
	 * 处理数据集
	 * @param obj
	 * @date	2013-10-18
	 * @create	hongxiao.z
	 */
	public static void process(Object obj)
	{
		Class<?> clazz = null;
		if(obj instanceof Class)
		{
			clazz = (Class<?>)obj;
		}
		else
		{
			clazz = obj.getClass();
		}
		
		/*判断是否实现接口*/
//		if(!IXmlData.class.isAssignableFrom(clazz))
//		{
//			log.warn(new StringBuilder("非法的数据集类型-[").append(obj.getClass().getSimpleName()).append("]").toString());
//			return;
//		}
		
		/*解析处理所有字段*/
		processFields(clazz);
	}
	
	/**
	 * 处理数据集中心类字段数据
	 * @param clazz
	 * @date	2013-10-18
	 * @create	hongxiao.z
	 */
	private static void processFields(Class<?> clazz) 
	{
		for (Field field : clazz.getFields()) 
		{
			processFild(field);
		}
	}
	
	/**
	 * 处理一个字段
	 * @param field
	 * @date	2013-10-18
	 * @create	hongxiao.z
	 */
	private static void processFild(Field field)
	{
		/*不是静态变量*/
		if(!Modifier.isStatic(field.getModifiers()))
		{
			return;
		}
		
		/*final字段*/
		if(Modifier.isFinal(field.getModifiers()))
		{
			return;
		}
		
		boolean oldAccessible = field.isAccessible();
		field.setAccessible(true);
		
		try
		{
			field.set(null, XmlUnmarshaller.unmarshaller(field.getType()));
		}
		catch(Exception e)
		{
			log.error(field.getName() + "解析错误!", e);
		}
		
		field.setAccessible(oldAccessible);
	}
}
